# -*-coding utf-8 -*-

__project__ = 'le-bo16'
__file_name__ = 'pymysql1'
__author__ = 'hqDu'
__time__ = '2020-12-01 23:52'
__product_name = 'PyCharm'
# @fileName :pymysql1.py

# 不可以起import的包名作为文件名
# 在pycharm内访问数据库
# 右侧Database 或view-tool windows-database
# 与navicat一样，都是数据库客户端，通过客户端连接数据库，在python写的内容不会高亮显示，连接成功显示绿色


# pycharm连接数据库成功后，会有一个sql文件产生
# pycharm下载pymysql模块


# 使用python DB API访问数据库流程


# 1.导入pymysql
import pymysql
# from pymysql import *

def query_data():
    # 2.创建连接
    # python和mysql创建connection
    # 端口号一定是int类型
    conn = pymysql.connect(host='49.233.39.160', port=3306, user='user', password='leboAa!#$123', database='lebo16')

    # 3.获取cursor，相当于一个只针，指向需要指向需要访问的数据库
    cur = conn.cursor()

    # 4.执行查询、执行命令、获取数据、处理数据(任何操作都是基于游标的)
    sql = 'select * from scores'
    cur.execute(sql)
    # cur.execute返回执行记录的个数
    # count = cur.execute(sql)
    # print(count)

    # 打印
    # ret1 = cur.fetchone()  # 打印1条
    # ret1 = cur.fetchmany(2)  # 打印固定数量的记录，即使超过最大数量，也不会报越界错误
    ret1 = cur.fetchall()  # 打印所有的数据
    print(ret1)

    sql1 = 'select * from scores where score > 80'
    cur.execute(sql1)

    # 显示查询的数据
    # 如果有多条查询，查询结果会出现覆盖，所以，每查询一次紧跟着fetch，再打印
    ret = cur.fetchone()  # 打印1条
    # ret = cur.fetchmany(2)  # 打印固定数量的记录
    # ret = cur.fetchall()  # 打印所有的数据
    print(ret)

    cur.close()
    conn.close()


def creat_table():
    # 2.创建连接
    # python和mysql创建connection
    # 端口号一定是int类型
    conn = pymysql.connect(host='49.233.39.160', port=3306, user='user', password='leboAa!#$123', database='lebo16')

    # 3.获取cursor，相当于一个只针，指向需要指向需要访问的数据库
    cur = conn.cursor()

    # 4.执行查询、执行命令、获取数据、处理数据(任何操作都是基于游标的)
    sql = 'drop table if EXISTS students1'
    cur.execute(sql)

    """
    三引号，保留其原本的格式
    """
    sql1 = """create table students1(
      id int unsigned primary key auto_increment,
      name varchar(20),
      age int unsigned,
      height decimal(5,2))"""

    try:
        cur.execute(sql1)
    except Exception as e:
        print("创建表失败", e)
    else:
        print("创建表成功")
    finally:
        # 无论是否创建成功都关闭
        # 关闭cursor
        cur.close()
        # 关闭connection
        conn.close()

def insert_data():
    # 2.创建连接
    # python和mysql创建connection
    # 端口号一定是int类型
    conn = pymysql.connect(host='49.233.39.160', port=3306, user='user', password='leboAa!#$123', database='lebo16')

    # 3.获取cursor，相当于一个只针，指向需要指向需要访问的数据库
    cur = conn.cursor()

    # 4.执行查询、执行命令、获取数据、处理数据(任何操作都是基于游标的)
    sql = """insert into students1 VALUES 
    (1, 'liu', 18, 167.2);"""

    try:
        # python默认python和mysql相连，必带事务
        # 事务的四大特性：
        # 原子性（不可分割最小工作单元）、
        # 一致性（要么都成功要么都失败）、
        # 隔离性（事务修改后没有提交之前，其他事务不可见）
        # 持久性：一旦提交成功，就算系统崩溃，对事物的修改修改永久保存在数据库
        # 触发事物的操作：insert、delete、update
        # 事务是数据库的操作，需要用conn去commit/rollback
        # 插入数据需要commit
        cur.execute(sql)
        conn.commit()
    except Exception as e:
        print("插入数据失败", e)
        conn.rollback()
    else:
        print("插入数据成功")
    finally:
        # 无论是否创建成功都关闭
        # 关闭cursor
        cur.close()
        # 关闭connection
        conn.close()


def query_data_sql():
    # 2.创建连接
    # python和mysql创建connection
    # 端口号一定是int类型
    conn = pymysql.connect(host='49.233.39.160', port=3306, user='user', password='leboAa!#$123', database='lebo16')

    # 3.获取cursor，相当于一个只针，指向需要指向需要访问的数据库
    cur = conn.cursor()

    # 4.执行查询、执行命令、获取数据、处理数据(任何操作都是基于游标的)
    number = input("序号：")
    cur.execute("select * from students where students.studentNo=%s;" % number)
    # sql注入问题已经得到解决，在cur.execute已经封装好了
    # cur.execute("select * from students where students.studentNo=%s;", [number])

    ret = cur.fetchall()
    print(ret)
    'or 1=1 or'
    # 序号：'or 1=1 or'


    cur.close()
    conn.close()

query_data_sql()

